#include "RightWidgetUI.h"
#include <QDebug>
#include <QVBoxLayout>
#include <QRadioButton>
#include <QGroupBox>
#include <QLabel>
#include <QGridLayout>
#include <QHBoxLayout>

RightWidgetUI::RightWidgetUI(QWidget *parent)
        : QWidget(parent)
{
    // 创建垂直布局
    layout = new QVBoxLayout(this);
    layout->setSpacing(5);
    layout->setContentsMargins(5, 5, 5, 5);

    // 创建分组框
    QGroupBox *radioGroupBox = new QGroupBox("选择模式", this);
    QGridLayout *radioLayout = new QGridLayout(radioGroupBox);

    // 创建按钮组（成员变量）
    buttonGroup = new QButtonGroup(this);
    buttonGroup->setExclusive(true);

    // 创建单选按钮
    QRadioButton *radio1 = new QRadioButton("None", this);
    QRadioButton *radio2 = new QRadioButton("旋转", this);
    QRadioButton *radio3 = new QRadioButton("缩放", this);
    QRadioButton *radio4 = new QRadioButton("平移", this);
    QRadioButton *radio5 = new QRadioButton("透视", this);
    // 其他按钮略（你可以继续写 radio6 ~ radio15）
    QRadioButton *radio6 = new QRadioButton("均值滤波", this);
    QRadioButton *radio7 = new QRadioButton("高斯滤波", this);
    QRadioButton *radio8 = new QRadioButton("中值滤波", this);
    QRadioButton *radio9 = new QRadioButton("双边滤波", this);
    QRadioButton *radio10 = new QRadioButton("自定义卷积", this);

    // 形态学操作（腐蚀、膨胀、开运算、闭运算）
    QRadioButton *radio11 = new QRadioButton("腐蚀", this);
    QRadioButton *radio12 = new QRadioButton("膨胀", this);
    QRadioButton *radio13 = new QRadioButton("开运算", this);
    QRadioButton *radio14 = new QRadioButton("闭运算", this);

    // 实现边缘检测操作
    QRadioButton *radio15 = new QRadioButton("Sobel边缘", this);
    QRadioButton *radio16 = new QRadioButton("Canny边缘", this);
    QRadioButton *radio17 = new QRadioButton("Laplacian边缘", this);

    // 添加到 group
    buttonGroup->addButton(radio1, 0);
    buttonGroup->addButton(radio2, 1);
    buttonGroup->addButton(radio3, 2);
    buttonGroup->addButton(radio4, 3);
    buttonGroup->addButton(radio5, 4);
    buttonGroup->addButton(radio6, 5);
    buttonGroup->addButton(radio7, 6);
    buttonGroup->addButton(radio8, 7);
    buttonGroup->addButton(radio9, 8);
    buttonGroup->addButton(radio10, 9);
    buttonGroup->addButton(radio11, 10);
    buttonGroup->addButton(radio12, 11);
    buttonGroup->addButton(radio13, 12);
    buttonGroup->addButton(radio14, 13);
    buttonGroup->addButton(radio15, 14);
    buttonGroup->addButton(radio16, 15);
    buttonGroup->addButton(radio17, 16);
    // 其他按钮依次添加...

    // 默认选中
    radio1->setChecked(true);

    // ====== 把按钮放到布局 ======
    radioLayout->addWidget(radio1, 0, 0);
    radioLayout->addWidget(radio2, 0, 1);
    radioLayout->addWidget(radio3, 1, 0);
    radioLayout->addWidget(radio4, 1, 1);
    radioLayout->addWidget(radio5, 2, 0);
    radioLayout->addWidget(radio6, 2, 1);
    radioLayout->addWidget(radio7, 3, 0);
    radioLayout->addWidget(radio8, 3, 1);
    radioLayout->addWidget(radio9, 4, 0);
    radioLayout->addWidget(radio10, 4, 1);
    radioLayout->addWidget(radio11, 5, 0);
    radioLayout->addWidget(radio12, 5, 1);
    radioLayout->addWidget(radio13, 6, 0);
    radioLayout->addWidget(radio14, 6, 1);
    radioLayout->addWidget(radio15, 7, 0);
    radioLayout->addWidget(radio16, 7, 1);
    radioLayout->addWidget(radio17, 8, 0);


    // ================== 滑动条模块 ==================
    QGroupBox *sliderGroupBox = new QGroupBox("参数调节", this);
    QVBoxLayout *sliderLayout = new QVBoxLayout(sliderGroupBox);

    // ====== 范围 0-1 ======// 创建一个水平滑动条 slider1，父控件为 this（RightWidgetUI）
    slider1 = new QSlider(Qt::Horizontal, this);
    slider1->setRange(0, 10);    // 设置滑动条范围为 0~10，对应最终显示的 0.0~1.0（整数映射小数）
    slider1->setValue(0);    // 设置滑动条初始值为 0（对应显示 0.0）
    QLabel *valueLabel1 = new QLabel("0.0", this);    // 创建一个标签 valueLabel1，用于显示滑动条当前值，初始显示 "0.0"
    // 连接滑动条的 valueChanged(int) 信号到一个 lambda 表达式
    // 每次滑动条值变化时执行 lambda，把整数值映射为 0~1 的小数并显示
    connect(slider1, &QSlider::valueChanged, valueLabel1, [=](int v){
        double val = v / 10.0;                           // 映射为小数
        valueLabel1->setText(QString::number(val, 'f', 1)); // 转成字符串，保留 1 位小数
    });
    QHBoxLayout *hLayout1 = new QHBoxLayout();    // 创建一个水平布局，用于放置标签和滑动条
    hLayout1->addWidget(new QLabel("范围 0-1", this));    // 添加一个静态标签显示 "范围 0-1"
    hLayout1->addWidget(slider1);    // 添加滑动条到布局
    hLayout1->addWidget(valueLabel1);    // 添加用于显示数值的标签到布局
    sliderLayout->addLayout(hLayout1);    // 将这个水平布局添加到父布局 sliderLayout 中

    // 增加按钮模块
    righbuttonDealD1 = new QPushButton("运行函数", this);
    layout->addWidget(radioGroupBox);
    layout->addWidget(sliderGroupBox); // 把滑动条模块加入主布局
    layout->addWidget(righbuttonDealD1);

    // slider1 的信息操作 这两行代码是 Qt 信号槽机制 的用法
    /*
     * 当 slider1（滑动条）的值发生变化时，会触发它的信号 valueChanged(int)。
     * 这个信号会连接到你类里的槽函数 RightWidgetUI::onSliderValueChanged(int)。
     * 所以每次滑块滑动时，都会调用你自己定义的处理函数 onSliderValueChanged，你可以在里面写一些业务逻辑。
     * */
    connect(slider1, &QSlider::valueChanged, this, &RightWidgetUI::onSliderValueChanged);
    /*
     * 同样监听 slider1 的 valueChanged(int) 信号。
     * 但是这次不是调用一个类成员函数，而是直接用 lambda 表达式（匿名函数）。
     * [=] 表示按值捕获外部变量（在这里其实用不到外部变量，主要是写法习惯）。
     * (int v) 表示接收滑动条传过来的新值。
     * valueLabel1->setText(QString::number(v)) 就是把这个整数转成字符串，并更新到 valueLabel1（一个 QLabel）上。
     * */
    connect(slider1, &QSlider::valueChanged, valueLabel1, [=](int v){
        double val = v / 10.0;  // 整数映射为 0.0~1.0
        valueLabel1->setText(QString::number(val, 'f', 1)); // 保留 1 位小数
    });
}

QString RightWidgetUI::getSelectedMode() const {// 获得当前获得的单选
    QString checked = buttonGroup->checkedButton()->text();
    return checked;
}


void RightWidgetUI::onSliderValueChanged(int value) {
    QString mode = getSelectedMode();   // 获取当前选中的单选
    QSlider *slider = qobject_cast<QSlider*>(sender());  // 找到是哪个滑动条发出的信号
    if(mode=="None"){// 如果是无模式,那么不进行操作
        qDebug() << "当前模式：" << mode << "，滑动条值：" << value;
    }
    if(mode=="缩放") {// 如果是缩放模式
        qDebug() << "当前模式：" << mode << "，滑动条值：" << value;
    }
    // 🔥 发射信号，让 MainCode 处理
    emit sliderActionRequested(mode, slider, value);
}